# 单利设计模式：作为对象的创建模式，单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例。这个类成为单例类。

class Singleton(object):
    __instance = None

    @classmethod
    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            # 申请内存，创建一个对象，并把对象的类型设置为cls
            cls.__instance = object.__new__(cls)
        return cls.__instance

    def __init__(self, a, b):
        self.a = a
        self.b = b


# 在创建object时，会调用__new__方法（申请内存）
# 如果不重写__new__，会调用object的__new__方法
# 如果重写__new__，对调用重写的__new__方法

s1 = Singleton('ax', 7)
s2 = Singleton('ann', 16)

print(type(s1))
print(hex(id(s1)))
print(hex(id(s2)))
# __new__使得s1, s2指向同一块内存
print(s1 is s2)  # True
print('s1 = {}, {}'.format(s1.a, s1.b))
print('s2 = {}, {}'.format(s2.a, s2.b))
